#pragma once
#include <iostream>
#include "logger.hpp"
#include "common.hpp"
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string>
#include <cstring>
using namespace logger_module;

class InetAddr 
{
public:
    InetAddr(){}
    InetAddr(const struct sockaddr_in& addr)//等下试试能不能加const
    :_addr(addr)
    {
        _ip = inet_ntoa(_addr.sin_addr);
        _port =ntohs(_addr.sin_port);
    }
    InetAddr(const std::string& ip,uint16_t port)
    :_port(port),
    _ip(ip)
    {
        memset(&_addr,0,sizeof(_addr));
        _addr.sin_family=AF_INET;
        inet_pton(AF_INET,_ip.c_str(),&_addr.sin_addr);
        _addr.sin_port=htons(port);
    }
    InetAddr(const uint16_t port)
    :_port(port),
    _ip()
    {
        memset(&_addr,0,sizeof(_addr));
        _addr.sin_family=AF_INET;
        _addr.sin_addr.s_addr=INADDR_ANY;
        char ipbuffer[64];
        inet_ntop(AF_INET,&_addr.sin_addr,ipbuffer,sizeof(ipbuffer));
        _ip=ipbuffer;
        _addr.sin_port=htons(port);
    }
    void SetAddr(struct sockaddr_in &addr)
    {
        _addr = addr;
        // 网络转主机
        _port = ntohs(_addr.sin_port); // 从网络中拿到的！网络序列
        // _ip = inet_ntoa(_addr.sin_addr); // 4字节网络风格的IP -> 点分十进制的字符串风格的IP
        char ipbuffer[64];
        inet_ntop(AF_INET, &_addr.sin_addr, ipbuffer, sizeof(_addr));
        _ip = ipbuffer;
    }
    uint16_t Port()
    {
        return _port;
    }
    std::string Ip()
    {
        return _ip;
    }
    const struct sockaddr_in& Addr()
    {
        return _addr;
    }
    
     struct sockaddr*NetAddrPtr()
    {
        return TO_SOCKADDR(_addr);
    }
    socklen_t  Addrlen()
    {
        return sizeof(_addr);
    }
    std::string addr_name()
    {
        _ip = inet_ntoa(_addr.sin_addr);
        _port =ntohs(_addr.sin_port);
        return _ip+":"+std::to_string(_port);
    }
    bool operator==(InetAddr& addr)
    {
        if(_ip==addr._ip&&_port==addr._port) return true;
        return false;
    }

private:
    struct sockaddr_in _addr;
    std::string _ip;
    uint16_t _port;
};
